Skip to content

Nginx

1.1 Nginx 简介

  1. nginx 是一个高性能的HTTP和反向代理web服务器
  2. 其特点是占用内存小,并发能力强,支持热部署(修改配置升级版本不需要停机)

1.2 Nginx 作用

  1. 正向代理和反向代理区别
    • 正向代理是代理客户端的(如VPN),服务器不知道真实的客户端是谁
    • 反向代理是代理服务端的(如Nginx),客户端不知道真实的后端服务器是谁
  2. 负载均衡
    • 将请求按照一定的策略,分发给服务器,减轻服务器处理请求的压力
    • 常用策略:
      • 轮询
      • 权重:根据服务器的权重来转发请求
      • IP Hash:对每个请求的IP使用Hash算法,确保同一个IP始终访问同一个服务器(解决Session登录态丢失的问题,但是如果这台服务器挂了之后Session会丢失,推荐使用Redis或JWT解决Session共享的问题)
      • Least Conn:谁现在空闲,给谁发
  3. 动静分离
    • Nginx处理静态资源( .jpg,.html),而动态请求(接口查询),则通过 proxy_pass 转发,减轻后端压力

1.3 Nginx 常用命令

命令作用
nginx -t最常用。测试配置文件语法是否正确。
nginx -s reload不重启服务的情况下,重新加载配置。
nginx -s stop强制停止。
tail -f /var/log/nginx/error.log排查报错。看最新的错误日志。

1.4 Nginx配置

  1. nginx配置文件结构

    Nginx 的配置是层级结构的:

    • Main (全局块):配置运行用户、工作进程数(worker_processes)、错误日志路径。
    • Events (事件块):配置每个进程的最大连接数。
    • Http (HTTP 块)
      • Upstream (负载均衡块):定义服务器组。
      • Server (虚拟主机块):定义一个网站(监听哪个端口、哪个域名)。
        • Location (路由块):定义具体的路0径匹配规则(比如 /api 走代理,/static 走文件系统)。

    image-20260303172140932

    1. 使用

      • Upstream 块:后端资源池配置

      upstream 块定义了后端服务器集群,负责“请求分发策略”。

      nginx
      # 定义后端服务器组,命名为 my_backend
      upstream my_backend {
          # 策略 1:ip_hash (可选)
          # 每个请求按访问 IP 的 hash 结果分配,使同一客户端固定访问一台后端,解决 Session 共享问题
          ip_hash;
      
          # 策略 2:轮询与权重
          # weight:权重,数值越高被分配的概率越大,适合服务器硬件性能不一的情况
          server 192.168.1.10:8080 weight=5;
      
          # 策略 3:健康检查与故障转移
          # max_fails:最大失败次数,超过后认为该服务器不可用
          # fail_timeout:在规定时间内如果失败次数达到上限,该服务器将被暂停服务
          server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
      
          # 策略 4:备用机
          # backup:热备,只有当上面的服务器全线崩溃时,才会启用这一台
          server 192.168.1.12:8080 backup;
      
          # 策略 5:停机维护
          # down:手动标记某台服务器暂时不参与负载均衡
          server 192.168.1.13:8080 down;
      
          # 策略 6:长连接保持
          # keepalive:设置与后端服务器保持的空闲长连接最大数量,提高并发性能
          keepalive 32;
      }

      • Server 块:站点服务与代理配置

      server 块负责监听端口、匹配域名,并决定请求该“读本地文件”还是“转给后端”。

      nginx
      server {
          # --- 基础配置 ---
          listen       80;                       # 监听 IPv4 的 80 端口
          server_name  www.example.com;          # 匹配的域名,支持多个,空格隔开
          charset      utf-8;                    # 设置响应编码,防止中文乱码
      
          # --- 性能优化配置 ---
          client_max_body_size 20m;              # 允许客户端上传文件的最大值,防止 413 报错
          gzip on;                               # 开启 Gzip 压缩,减少网络传输流量
          gzip_types text/plain application/javascript text/css; # 压缩的文件类型
      
          # --- 日志配置 ---
          access_log  /var/log/nginx/access.log; # 记录访问请求日志
          error_log   /var/log/nginx/error.log;  # 记录错误信息日志
      
          # --- 静态资源处理 (前端部署) ---
          location / {
              root   /usr/share/nginx/html;      # 项目在磁盘上的真实路径
              #请求路径: http://example.com/static/logo.png
      
      		#实际查找路径: /var/www/app/static/logo.png
              #即:root + location + 文件名
      
              #注意区分 alias: 如果使用 alias,Nginx 会替换掉匹配到的路径。如果是 alias /var/www/app/;,同样的请			求会去 /var/www/app/logo.png 找(去掉了 /static/)。
              
              index  index.html index.htm;       # 默认的入口文件名
              
              # SPA 核心配置:如果路径不存在,重定向到 index.html,防止 Vue 路由刷新 404
              try_files $uri $uri/ /index.html;
              
              # 缓存设置:对 html 不缓存,对静态资源(js/css)设置长缓存
              if ($request_filename ~* .*\.(?:htm|html)$) {
                  add_header Cache-Control "no-cache";
              }
          }
      
          # --- 动态请求转发 (接口代理) ---
          location /api/ {
              
              # 转发目标:指向上方定义的 upstream 名称
              proxy_pass http://my_backend;
      
              # 头部信息透传:确保后端能拿到客户端的原始信息
              proxy_set_header Host $host;                # 传递原始域名
              proxy_set_header X-Real-IP $remote_addr;    # 传递客户端真实 IP
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递代理链路 IP
      
              # 超时设置:防止后端卡死导致 Nginx 挂起
              proxy_connect_timeout 60s;         # 与后端建立连接的超时时间
              proxy_read_timeout 60s;            # 后端处理完毕返回数据的超时时间
              proxy_send_timeout 60s;            # 发送数据给后端的超时时间
          }
      
          # --- 错误处理 ---
          error_page   404              /404.html; # 当出现 404 时显示的页面
          error_page   500 502 503 504  /50x.html; # 当服务器报错时显示的页面
          location = /50x.html {
              root   /usr/share/nginx/html;
          }
      }

      • 查阅小清单 (Best Practices)
      1. 分文件管理:不要把所有 server 都塞在 nginx.conf 里。建议在 /etc/nginx/conf.d/ 目录下为每个项目创建一个 .conf 文件。
      2. 修改即测试:每次改完配置文件,必须执行 nginx -t 检查语法。
      3. 平滑生效:使用 nginx -s reload 代替 restart,这样不会中断已经在运行的连接。
      4. 安全建议:在生产环境中,建议再增加一个 server 块监听 443 端口,配置 SSL 证书(HTTPS)。
    2. location匹配符(决定优先级)

      匹配符含义优先级备注
      =精确匹配1 (最高)必须完全一致,如 location = /login
      ^~优先前缀匹配2匹配成功后,立即停止往下搜索正则
      ~区分大小写正则3按照在配置文件中出现的先后顺序匹配
      ~\*不区分大小写正则3同上
      /普通前缀匹配4 (最低)如果没有正则匹配中,最后才用它